home *** CD-ROM | disk | FTP | other *** search
- /*{{{}}}*/
- /*{{{ #includes*/
- #include <ctype.h>
- #include <string.h>
- #include <stdlib.h>
- #include <stdio.h>
-
- #define PARSEMAC_C
-
- #include "keybind.h"
- #include <lib/ori_add_lib.h>
- /*}}} */
-
- /*{{{ variables*/
- private boolean op_recursiv = False;
- /*}}} */
-
- /*{{{ parse_macro*/
- /*{{{ get_arg_terms*/
- private TOKEN *get_arg_terms(TOKEN *buff,int args,int dummy_base,boolean *ret_used)
- { int i;
-
- begin_parse();
- for (i=0;i<args;i++)
- { tokens token;
-
- if ((token=get_full_token())!=DEFAULT)
- if (!(buff=parse_term(token,buff,ocl_arg_var(i),dummy_base,ret_used)))
- return(0);
- }
- end_parse(M_WANTEND);
- return(buff);
- }
- /*}}} */
-
- public TOKEN *parse_macro(TOKEN *buff,int dummy_base,boolean *ret_used)
- {
- tokens token;
- tokens to;
-
- begin_parse();
- do {
- check_length(buff);
- token=get_full_token();
- switch (token) {
- /*{{{ repeat*/
- case REPEAT:
- { boolean r_end_used=False;
- TOKEN *call,*test,*ex;
-
- /*{{{ save old and get current repeat value*/
- *buff++=M_PUSH_INT;
- *buff++=repeat_var;
- if (!(buff=parse_term(get_full_token(),buff,repeat_var,dummy_base,ret_used)))
- return(0);
- /*}}} */
- /*{{{ call the repeated block, prepare the exit-statements*/
- call=buff;
- buff=generate_jmp(M_CALL,call,call);
- *buff++=M_POP_INT;
- *buff++=repeat_var;
- *buff++=M_END_MACRO;
- /*}}} */
- /*{{{ handle the test*/
- test=buff;
- *buff++=M_POSITIV_COUNTER;
- *buff++=repeat_var;
- ex=buff;
- buff=generate_jmp(M_JMP_FALSE,ex,ex);
- *buff++=M_ADD_COUNTER;
- *buff++=repeat_var;
- *buff++= -1;
- /*}}} */
- /*{{{ code the block*/
- if (!(buff=parse_macro(buff,dummy_base,&r_end_used))) return(0);
- buff=generate_jmp(M_JMP,buff,test);
- generate_jmp(M_JMP_FALSE,ex,buff);
- /*}}} */
- if (r_end_used)
- /*{{{ pop the adress for exit-handling*/
- { *ret_used=True;
- generate_jmp(M_CALL,call,test);
- /*{{{ pop the adress (don't execute the M_END_MACRO!)*/
- *buff++=M_POP_INT;
- *buff++=repeat_var;
- /*}}} */
- }
- /*}}} */
- else
- /*{{{ call test -> jmp test*/
- generate_jmp(M_JMP,call,test);
- /*}}} */
- /*{{{ restore old loop counter*/
- *buff++=M_POP_INT;
- *buff++=repeat_var;
- /*}}} */
- break;
- }
- /*}}} */
- /*{{{ local*/
- case LOC:
- {
- /*{{{ comments*/
- /* macros, using return-from-macro must be called via subroutine-call,
- * to guarantee the proper stack-handling. In this case
- * M_PUSH_INT var1
- * :
- * M_PUSH_INT varn
- * M_CALL x
- * M_JMP e
- * x macro
- * M_END_MACRO
- * e M_POP_INT varn
- * :
- * M_POP_INT var1
- * is generated instead of
- * M_PUSH_INT var1
- * :
- * M_PUSH_INT varn
- * macro
- * M_POP_INT varn
- * :
- * M_POP_INT var1
- */
- /*}}} */
-
- int l_vars[int_dummy_vars];
- int l_vars_c;
- tokens next;
-
- begin_parse();
- /*{{{ list of vars*/
- l_vars_c=0;
- while ((next=name_to_var(get_full_token(),1,new_vars_enabled))!=END)
- if (next==VARIABLE)
- /*{{{ already defined var*/
- { *buff++ = M_PUSH_INT;
- *buff++ = (TOKEN) (l_vars[l_vars_c++]=tk_var->no);
- }
- /*}}} */
- else
- m_exit(M_NOVAR);
- /*}}} */
- /*{{{ parse_statement, maybe handle call/jmp*/
- { TOKEN *jump,*block,*call;
- boolean l_ret_used=False;
-
- buff=generate_jmp(M_CALL,call=buff,buff);
- /*{{{ pop all local vars*/
- { int v_x=l_vars_c;
-
- while (v_x>0) { *buff++ = M_POP_INT;*buff++ = l_vars[--v_x]; }
- }
- /*}}} */
- buff=generate_jmp(M_JMP,jump=buff,call);
- generate_jmp(M_CALL,call,block=buff);
- if (!(buff=parse_macro(buff,dummy_base,&l_ret_used))) return(0);
- if (l_ret_used)
- /*{{{ internal macro used return-from-macro -> subroutine-call*/
- { *buff++ =M_END_MACRO;
- generate_jmp(M_JMP,jump,buff);
- }
- /*}}} */
- else
- /*{{{ normal code, delete call/jmp*/
- { while (call!=block) *call++=O_NOP;
- /*{{{ pop all local vars*/
- { int v_x=l_vars_c;
-
- while (v_x>0) { *buff++ = M_POP_INT;*buff++ = l_vars[--v_x]; }
- }
- /*}}} */
- }
- /*}}} */
- }
- /*}}} */
- break;
- }
- /*}}} */
- /*{{{ while*/
- case WHILE:
- { TOKEN *whilestart,*jmpad;
-
- if (!(jmpad=parse_cond(whilestart=buff,dummy_base,ret_used))) return(0);
- buff=generate_jmp(M_JMP_FALSE,jmpad,jmpad);
- if (!(buff=parse_macro(buff,dummy_base,ret_used))) return(0);
- buff=generate_jmp(M_JMP,buff,whilestart);
- generate_jmp(M_JMP_FALSE,jmpad,buff);
- break;
- }
- /*}}} */
- /*{{{ do*/
- case DO: {
- TOKEN *dostart=buff;
-
- if (!(buff=parse_macro(buff,dummy_base,ret_used)))
- return(0);
- /*{{{ read the while*/
- if ((to=get_full_token())!=WHILE)
- m_exit(M_NOWHILE);
- /*}}} */
- if (!(buff=parse_cond(buff,dummy_base,ret_used)))
- return(0);
- buff=generate_jmp(M_JMP_TRUE,buff,dostart);
- break;
- }
- /*}}} */
- /*{{{ case*/
- case CASE: {
- TOKEN *defaultjmp=0,*condptr;
-
- token=get_full_token();
- do
- { switch (token)
- { default:
- m_exit(M_NOESAC);
- case ESAC:
- break;
- /*{{{ BEGIN -> cond macro*/
- case BEGIN: {
- if (!(condptr=parse_cond(buff,dummy_base,ret_used)))
- return(0);
- buff=generate_jmp(M_JMP_FALSE,condptr,condptr);
- if (!(buff=parse_macro(buff,dummy_base,ret_used)))
- return(0);
- if (defaultjmp)
- buff=generate_jmp(M_JMP,buff,defaultjmp);
- else
- buff=generate_jmp(M_JMP,defaultjmp=buff,buff);
- generate_jmp(M_JMP_FALSE,condptr,buff);
- end_parse(M_CASEEND);
- token=get_full_token();
- break;
- }
- /*}}} */
- /*{{{ DEFAULT*/
- case DEFAULT:
- if (!(buff=parse_macro(buff,dummy_base,ret_used))) return(0);
- token=get_full_token();
- break;
- /*}}} */
- }
- }
- while (token!=ESAC);
- if (defaultjmp)
- generate_jmp(M_JMP,defaultjmp,buff);
- break;
- }
- /*}}} */
- /*{{{ if*/
- case IF: {
- TOKEN *jmpadr,*endtrue;
-
- if (!(jmpadr=parse_cond(buff,dummy_base,ret_used)))
- return(0);
- buff=generate_jmp(M_JMP_FALSE,jmpadr,jmpadr);
- if (!(endtrue=parse_macro(buff,dummy_base,ret_used)))
- return(0);
- token=get_full_token();
- switch (token)
- { default:
- m_exit(M_NOELSEFI);
- /*{{{ if else fi*/
- case ELSE:
- buff=generate_jmp(M_JMP,endtrue,endtrue);
- generate_jmp(M_JMP_FALSE,jmpadr,buff);
- if (!(buff=parse_macro(buff,dummy_base,ret_used)))
- return(0);
- generate_jmp(M_JMP,endtrue,buff);
- if ((to=get_full_token())!=FI)
- m_exit(M_NOFI);
- break;
- /*}}} */
- /*{{{ if fi*/
- case FI:
- generate_jmp(M_JMP_FALSE,jmpadr,endtrue);
- buff=endtrue;
- break;
- /*}}} */
- }
- break;
- }
- /*}}} */
- /*{{{ return- value- from-macro*/
- case RETVAL: {
- int result=dummy_var(dummy_base);
-
- if (!(buff=parse_term(name_to_var(get_full_token(),1,new_vars_enabled),buff,result,dummy_base+1,ret_used)))
- return(0);
- *buff++ = M_PUSH_INT;
- *buff++ = (TOKEN)result;
- *buff++ = M_POP_INT;
- *buff++ = (TOKEN)return_var;
- }
- case RETURN:
- *ret_used=True;
- *buff++ = M_END_MACRO;
- break;
- /*}}} */
- /*{{{ simple commands, which are not allowed on keyboard!*/
- case POP_DELBUFF: *buff++=M_POP_DELBUF;break;
- case SCROFF: *buff++=M_SCREEN_OFF;break;
- case SCRON: *buff++=M_SCREEN_ON;break;
- case RESTORE_LAYOUT: *buff++=M_LAYOUT;*buff++=1;break;
- case SAVE_LAYOUT:*buff++=M_LAYOUT;*buff++=0;break;
- /*}}} */
- /*{{{ set/reset-user-mode*/
- case SET_U_M_N:
- case SET_U_M:
- case RESET_U_M: {
- int i=used_modes-1;
- tokens user_token=token;
- boolean d=False;
-
- if ((token=get_full_token())!=NAME)
- i= -1;
- while (i>=0)
- if (!ustrcmp(tk_string,modenames[i]))
- break;
- else
- i--;
- if (i<0)
- m_exit(M_UMNAME);
- if (user_token==SET_U_M_N)
- { to=name_to_var(get_full_token(),1,new_vars_enabled);
- if (to!=VARIABLE)
- { if (!(buff=parse_term(to,buff,dummy_var(dummy_base),dummy_base+1,ret_used))) return(0);
- d=True;
- }
- }
- *buff++ = (user_token==SET_U_M) ? M_SET_USER_MODE:
- (user_token==SET_U_M_N) ? M_SET_USER_MODE_NUMB :
- M_RESET_USER_MODE;
- *buff++ = (TOKEN) i;
- if (user_token==SET_U_M_N)
- *buff++=(TOKEN)(d?dummy_var(dummy_base):tk_var->no);
- break;
- }
- /*}}} */
- /*{{{ set-counter*/
- case SET_COUNTER:
- { int no,size,dest,ind;
-
- /*{{{ get destination*/
- switch (name_to_var(get_full_token(),0,new_vars_enabled))
- {
- case VARIABLE:
- if ((size=tk_var->size)==1)
- /*{{{ single var*/
- { no=tk_var->no;
- size=1;
- break;
- }
- /*}}} */
- else
- /*{{{ array var*/
- { begin_parse();
- dest=tk_var->no;
- ind=dummy_var(dummy_base++);
- if (!(buff=parse_term(get_full_token(),buff,ind,dummy_base,ret_used))) return(0);
- no=dummy_var(dummy_base++);
- end_parse(M_WANTEND);
- break;
- }
- /*}}} */
- default:
- m_exit(M_NOVAR);
- }
- /*}}} */
- if (!(buff=parse_term(get_full_token(),buff,no,dummy_base,ret_used))) return(0);
- if (size>1)
- /*{{{ move result to field*/
- { *buff++=M_PUSH_INT;
- *buff++=(TOKEN)no;
- *buff++=M_POP_INT_X;
- *buff++=(TOKEN)dest;
- *buff++=(TOKEN)ind;
- }
- /*}}} */
- break;
- }
- /*}}} */
- /*{{{ history*/
- case HISTORY:
- { histories h;
-
- *buff++=M_HISTORY;
- if ((h=name_to_history(get_full_token(),False))==unknown_history)
- m_exit(M_NOHISTORY);
- else
- *buff++=(TOKEN) h;
- break;
- }
- /*}}} */
- /*{{{ repeated term commands with ()*/
- case LOAD:
- { boolean in;
- tokens to;
-
- /*{{{ get (, and maybe the leading not*/
- switch (get_full_token())
- { case BEGIN:
- in=True;
- break;
- case NOT:
- if (get_full_token()==BEGIN)
- { in=False;
- break;
- }
- default:
- m_exit(M_WANTBEGIN);
- }
- /*}}} */
- while ((to=get_full_token())!=END)
- { if (!(buff=parse_term(to,buff,dummy_var(dummy_base),dummy_base+1,ret_used)))
- return(0);
- *buff++=M_LOAD_MAC;
- *buff++=(TOKEN)in;
- *buff++=dummy_var(dummy_base);
- }
- break;
- }
- /*}}} */
- /*{{{ commands with one term argument*/
- case INSERT_ASCII:
- case ECHO_B:
- case HISTORY_GET:
- case SET_CURSOR:
- case SHOW_CURSOR:
- case COUNTER:
- case HELP_SET:
- case GOTO_BUFFER:
- case GOTO_BUFFER_ID:
- case GOTO_COUNTER:
- case GOTO_MARK:
- case GOTO_Y:
- { boolean d=False;
- histories h;
-
- /*{{{ maybe get history argument for HISTORY_GET*/
- if (token==HISTORY_GET)
- /*{{{ get history list*/
- { if ((h=name_to_history(get_full_token(),False))==unknown_history)
- m_exit(M_NOHISTORY);
- }
- /*}}} */
- else
- h=unknown_history;
- /*}}} */
- /*{{{ get variable or eval term*/
- to=name_to_var(get_full_token(),0,new_vars_enabled);
- /*{{{ maybe handle msg*/
- if (token==INSERT_ASCII && to==NAME)
- { int msgid;
-
- msgid=name2msg(tk_string);
- if (msgid>=0)
- { *buff++ = M_PROMPT;
- *buff++ = -3;
- *buff++ = -msgid;
- *buff++ = M_END_MACRO;
- break;
- }
- }
- /*}}} */
- if (to!=VARIABLE || tk_var->size!=1)
- { if (!(buff=parse_term(to,buff,dummy_var(dummy_base),dummy_base+1,ret_used))) return(0);
- d=True;
- }
- /*}}} */
- /*{{{ put command*/
- if (token==GOTO_Y)
- { *buff++ = O_GOTO_LINE;*buff++ = M_INT_STRING; }
- else if (token==GOTO_BUFFER)
- { *buff++=M_GO_BUFFER;*buff++=0; }
- else if (token==GOTO_BUFFER_ID)
- { *buff++=M_GO_BUFFER;*buff++=1; }
- else
- { *buff++ = (token==GOTO_COUNTER)? M_GO_COUNTER_X_POS :
- (token==INSERT_ASCII)? M_ASCII :
- (token==HELP_SET) ? M_SHOW_HELP :
- (token==SHOW_CURSOR) ? M_SHOW_CURSOR :
- (token==SET_CURSOR) ? O_FLUSH :
- (token==HISTORY_GET) ? M_GET_HISTORY :
- (token==GOTO_MARK) ? M_GOTO_MARK :
- (token==ECHO_B) ? M_ECHO_I :
- M_INT_STRING;
- }
- /*}}} */
- /*{{{ maybe write history argument for HISTORY_GET*/
- if (h!=unknown_history) *buff++ = (TOKEN)h;
- /*}}} */
- /*{{{ put var/term arg*/
- *buff++=(TOKEN)(d?dummy_var(dummy_base):tk_var->no);
- if (token==GOTO_Y) *buff++ = O_RETURN;
- /*}}} */
- break;
- }
- /*}}} */
- /*{{{ commands with two term argument*/
- case CHANGE_FOLD:
- { int n1;
- int n2;
-
- /*{{{ get term 1*/
- to=name_to_var(get_full_token(),0,new_vars_enabled);
- if (to!=VARIABLE || tk_var->size!=1)
- { if (!(buff=parse_term(to,buff,n1=dummy_var(dummy_base),dummy_base+1,ret_used))) return(0);
- }
- else
- n1=tk_var->no;
- /*}}} */
- /*{{{ get term 2*/
- to=name_to_var(get_full_token(),0,new_vars_enabled);
- if (to!=VARIABLE || tk_var->size!=1)
- { if (!(buff=parse_term(to,buff,n2=dummy_var(dummy_base),dummy_base+1,ret_used))) return(0);
- }
- else
- n2=tk_var->no;
- /*}}} */
- *buff++=M_CHANGE_FOLD;
- *buff++=(TOKEN)n1;
- *buff++=(TOKEN)n2;
- break;
- }
- /*}}} */
- /*{{{ commands with prompts*/
- case EXITCODE:
- /*{{{ M_FINISH*/
- *buff++ = M_FINISH;
- if (!(buff=put_var(buff))) return(0);
- goto prompt_command_tail;
- /*}}} */
- case HISTORY_EDIT:
- case HISTORY_EDIT_F:
- case HISTORY_EDIT_L:
- /*{{{ M_EDIT_HISTORY*/
- { histories h;
-
- *buff++ = M_EDIT_HISTORY;
- *buff++ = (token==HISTORY_EDIT)?0:(token==HISTORY_EDIT_L)?1:2;
- if ((h=name_to_history(get_full_token(),False))==unknown_history)
- m_exit(M_NOHISTORY);
- *buff++=(TOKEN)h;
- goto prompt_command_tail;
- }
- /*}}} */
- case MENU:
- /*{{{ M_MENU*/
- *buff++ = M_MENU;
- if (!(buff=put_var(buff))) return(0);
- goto prompt_command_tail;
- /*}}} */
- case HELP_W:
- /*{{{ M_WRITE_HELP*/
- *buff++ = M_WRITE_HELP;
- if (!(buff=put_var(buff))) return(0);
- if (!(buff=put_var(buff))) return(0);
- goto prompt_command_tail;
- /*}}} */
- case ECHO_P:
- /*{{{ M_ECHO_P*/
- *buff++=M_ECHO_P;
- goto prompt_command_tail;
- /*}}} */
- case MESSAGE:
- /*{{{ M_PROMPT -2*/
- *buff++ = M_PROMPT;
- *buff++ = -2;
- goto prompt_command_tail;
- /*}}} */
- case PROMPT:
- /*{{{ M_PROMPT -1*/
- *buff++ = M_PROMPT;
- *buff++ = -1;
- goto prompt_command_tail;
- /*}}} */
- case PROMPT_CHAR:
- /*{{{ M_PROMPT_C*/
- *buff++ = M_PROMPT_C;
- if (!(buff=put_var(buff))) return(0);
- goto prompt_command_tail;
- /*}}} */
- case PROMPT_COUNTER:
- /*{{{ M_PROMPT var*/
- *buff++ = M_PROMPT;
- if (!(buff=put_var(buff))) return(0);
- goto prompt_command_tail;
- /*}}} */
- case GETENV:
- /*{{{ M_ENV_CMD 1*/
- *buff++ = M_ENV_CMD;
- *buff++ = (TOKEN)1;
- goto prompt_command_tail;
- /*}}} */
-
- prompt_command_tail:
- if (!(buff=get_message(buff))) {
- fprintf(stderr,M_NOPROMPT);
- return(0);
- }
- *buff++ = M_END_MACRO;
- break;
- /*}}} */
- /*{{{ defset*/
- case DEFSET:
- buff=parse_set_macro(buff);
- break;
- /*}}} */
- /*{{{ message-exit/exit*/
- case MES_EXIT:
- case EXIT: {
- *buff++ = M_EXIT;
- if (token==MES_EXIT && !(buff=get_message(buff))) {
- fprintf(stderr,M_NOMESSAGE);
- return(0);
- }
- *buff++ = M_END_MACRO;
- break;
- }
- /*}}} */
- /*{{{ opcode*/
- case OPCODE:
- if (tk_key->num!=O_NOP)
- if ((*buff++=tk_key->num)==O_FLUSH)
- *buff++=var_cur_lev;
- break;
- /*}}} */
- /*{{{ macrostring*/
- case MACRO: {
- TOKEN *x=tk_macro;
-
- check_length(buff+ustrlen(tk_string));
- while (*x) *buff++ = *x++;
- break;
- }
- /*}}} */
- /*{{{ previosly defined operation*/
- case OPERATION:
- {
- /*{{{ comments*/
- /* macros, using return-from-macro must be called via subroutine-call,
- * to guarantee the proper semantics. The return should abort the
- * called macro and not the current one. In this case
- * M_CALL x
- * M_JMP e
- * x macro
- * M_END_MACRO
- * e
- * is generated.
- */
- /*}}} */
-
- TOKEN *x=tk_operation->ops;
- int lg=tk_operation->length;
- TOKEN *call_ad,*jmp_ad=0;
- boolean o_ret_used=tk_operation->ret_used;
-
- /*{{{ maybe handle arguments*/
- if
- ( tk_operation->args
- && !(buff=get_arg_terms(buff,tk_operation->args,dummy_base,ret_used))
- )
- return(0);
- /*}}} */
- /*{{{ maybe subroutine handling*/
- if (o_ret_used)
- { call_ad=buff;
- jmp_ad=buff=generate_jmp(M_CALL,buff,buff);
- buff=generate_jmp(M_JMP,buff,buff);
- generate_jmp(M_CALL,call_ad,buff);
- }
- /*}}} */
- check_length(buff+lg);
- /*{{{ copy the macro*/
- while (lg--) *buff++ = *x++;
- /*}}} */
- /*{{{ maybe subroutine handling*/
- if (o_ret_used)
- { *buff++ = M_END_MACRO;
- generate_jmp(M_JMP,jmp_ad,buff);
- }
- /*}}} */
- break;
- }
- /*}}} */
- /*{{{ automacro/abortmacro/promptmacros/knb/view*/
- case DEFAUTOSAVE:
- case DEFQUIT:
- case DEFU1:
- case DEFU2:
- case B_CHG_MAC:
- case VMAC:
- case KNBM:
- case PRO_IN:
- case PRO_OUT:
- case DEFAB:
- case DEFAUTO: {
- int x= token==DEFAUTOSAVE?salarm_macro:
- (token==DEFQUIT?squit_macro:
- (token==DEFU1?susr1_macro:
- (token==DEFU2?susr2_macro:
- (token==DEFAB?abort_macro:
- (token==PRO_IN?pin_macro:
- (token==PRO_OUT?pout_macro:
- (token==KNBM?knb_macro:
- (token==VMAC?vm_no:
- (token==B_CHG_MAC?bc_mac:
- auto_macro)))))))));
-
- if (x) *buff++=O_EXE_MACRO+x;
- break;
- }
- /*}}} */
- case END: break;
- /*{{{ rekursiv on my own*/
- case NAME:
- op_recursiv=True;
- if (!ustrcmp(op_def_name,tk_string)) {
-
- /*{{{ maybe handle arguments*/
- if
- ( op_def_args
- && !(buff=get_arg_terms(buff,op_def_args,dummy_base,ret_used))
- )
- return(0);
- /*}}} */
- buff=generate_jmp(M_CALL,buff,m_def);
- break;
- }
- /*}}} */
- /*{{{ default=error*/
- default:
- m_exit(M_NOMSTRING);
- /*}}} */
- }
- }
- while (token!=END);
- if (!do_opt) *ret_used=True;
- return(buff);
- }
- /*}}} */
- /*{{{ opt_parse_macro*/
- public TOKEN *opt_parse_macro
- ( TOKEN *buff,
- int args,
- boolean *ret_used,
- boolean end_it,
- boolean rc_string_gen,
- boolean fix_args
- )
- { TOKEN *x;
- TOKEN *arg_call;
- TOKEN *called_block;
-
- x=buff;
- op_recursiv=False;
- if (args)
- /*{{{ push old local vars and get new values*/
- { int i=args;
-
- /*{{{ push old locs ans get new values*/
- while (i--)
- { *x++=M_PUSH_INT;
- *x++=(TOKEN)ocl_loc_var(i);
- *x++=M_PUSH_INT;
- *x++=(TOKEN)ocl_arg_var(i);
- *x++=M_POP_INT;
- *x++=(TOKEN)ocl_loc_var(i);
- }
- /*}}} */
- x=generate_jmp(M_CALL,arg_call=x,x);
- /*{{{ get old loc values back*/
- i=0;
- while (i<args)
- { *x++=M_POP_INT;
- *x++=ocl_loc_var(i);
- i++;
- }
- /*}}} */
- *x++=M_END_MACRO;
- generate_jmp(M_CALL,arg_call,x);
- called_block=x;
- }
- /*}}} */
- if (!(x=parse_macro(x,0,ret_used))) return(0);
- if (do_opt)
- { if (!*ret_used && !op_recursiv && args)
- /*{{{ don't use M_CALL to execute the body, pop locs now*/
- { generate_jmp(M_JMP,arg_call,called_block);
- /*{{{ generate new pops*/
- { int i=0;
-
- while (i<args)
- { *x++=M_POP_INT;
- *x++=ocl_loc_var(i);
- i++;
- }
- }
- /*}}} */
- }
- /*}}} */
- if (op_recursiv)
- /*{{{ M_END_MACRO must be used,otherwise recursion won't work*/
- { *ret_used=True;
- *x++=M_END_MACRO;
- }
- /*}}} */
- else if (end_it)
- /*{{{ simuale the M_END_MACRO, the optimizer can handle this*/
- *x++=M_END_MACRO;
- /*}}} */
- x=opt_mac(buff,x,False,rc_string_gen,fix_args);
- /*{{{ maybe delete simulated M_END_MACRO*/
- if (!op_recursiv && end_it && x>buff && *(x-1)==M_END_MACRO)
- x--;
- /*}}} */
- }
- return(x);
- }
- /*}}} */
-